package com.cjlgb.design.upms.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.cjlgb.design.common.mybatis.service.BaseService;
import com.cjlgb.design.upms.api.entity.SysRoleMenu;

import java.util.Collection;
import java.util.stream.Collectors;

/**
 * @author WFT
 * @date 2019/7/31
 * description: 系统角色菜单相关业务接口
 */
public interface SysRoleMenuService extends BaseService<SysRoleMenu> {

    /**
     * 查询关联的菜单Id列表
     * @param roleIds 角色Id列表
     * @return Collection<Long> 权限Id列表
     */
    default Collection<Long> selectRoleAuthorities(Collection<Long> roleIds){
        return this.list(
                Wrappers.<SysRoleMenu>lambdaQuery()
                        //  只查询菜单Id
                        .select(SysRoleMenu::getMenuId)
                        //  根据角色Id查询
                        .in(SysRoleMenu::getRoleId, roleIds)
        ).stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
    }

    /**
     * 根据角色Id查询权限Id列表
     * @param roleId 角色Id
     * @param type 类型：{ 1：模块，2：菜单，3：按钮, null: 全部 }
     * @return Collection<Long> 权限Id列表
     */
    default Collection<Long> selectRoleAuthorities(long roleId,Integer type){
        LambdaQueryWrapper<SysRoleMenu> wrapper = Wrappers.<SysRoleMenu>lambdaQuery()
                //  只查询菜单Id
                .select(SysRoleMenu::getMenuId)
                //  根据角色Id查询
                .eq(SysRoleMenu::getRoleId, roleId);
        //  根据类型查询
        if (null != type){
            wrapper.eq(SysRoleMenu::getType,type);
        }
        return this.list(wrapper).stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
    }

    /**
     * 根据菜单Id获取关联的角色Id列表
     * @param menuId 菜单Id
     * @return Collection<Long> 角色Id列表
     */
    default Collection<Long> selectRoleIdsByMenuId(long menuId){
        return this.list(
                Wrappers.<SysRoleMenu>lambdaQuery()
                        .select(SysRoleMenu::getRoleId)
                        .eq(SysRoleMenu::getMenuId,menuId)
        ).stream().map(SysRoleMenu::getRoleId).collect(Collectors.toList());
    }

    /**
     * 根据角色Id删除与菜单的关联
     * @param roleId 角色Id
     */
    default void deleteByRoleId(long roleId){
        this.remove(Wrappers.<SysRoleMenu>lambdaQuery().eq(SysRoleMenu::getRoleId,roleId));
    }

    /**
     * 根据角色Id列表删除与菜单的关联
     * @param roleIds 角色Id列表
     */
    default void deleteByRoleIds(Collection<Long> roleIds){
        this.remove(Wrappers.<SysRoleMenu>lambdaQuery().in(SysRoleMenu::getRoleId,roleIds));
    }

    /**
     * 根据菜单Id删除与角色的关联
     * @param menuId 菜单Id
     */
    default void deleteByMenuId(long menuId){
        this.remove(Wrappers.<SysRoleMenu>lambdaQuery().eq(SysRoleMenu::getMenuId,menuId));
    }


}
